package helpers

import (
	"io"
	"io/ioutil"
	"mime/multipart"
	"os"

	log "github.com/jeanphorn/log4go"
)

const (
	//HeadPicPath 用户头像所在文件夹
	HeadPicPath = "./images/headpic/"

	//DefaultImgPath 服务器图片所在文件夹
	DefaultImgPath = "./images/server_imgs/"
)

//LoadFile 加载文件
func LoadFile(fileName string) (string, error) {
	buf, err := ioutil.ReadFile(fileName)
	if err != nil {
		return "", err
	}

	return string(buf), nil
}

//SaveFile 保存文件
func SaveFile(fileName, path string, file multipart.File) error {

	//创建文件
	f, err := os.Create(path + fileName)
	if err != nil {
		log.LOGGER("SERVER").Error("创建文件%s失败:%v", fileName, err)
		return err
	}
	//结束前关闭刚才创建的文件
	defer f.Close()

	//复制缓存，每次读取1024*4个字节
	buf := make([]byte, 1024*4)
	for {
		//读取传入的文件
		n, errRead := file.Read(buf)
		if errRead != nil {
			if errRead == io.EOF {
				log.LOGGER("SERVER").Info("文件 %s 保存成功", fileName)
				return nil
			}

			log.LOGGER("SERVER").Info("文件%s接收出错:%v", fileName, errRead)
			return errRead
		}

		//写入到创建的文件
		_, _ = f.Write(buf[:n])
	}
}

//MakeHeadURL 自动生成默认用户头像
func MakeHeadURL(tokenStr string) error {
	srcName := DefaultImgPath + "default_head_pic.png"
	err := CopyFile(HeadPicPath+tokenStr+".png", srcName)
	return err
}

//CopyFile 复制文件
func CopyFile(dstName, srcName string) error {
	//读取被复制文件
	srcFile, errOpen := os.Open(srcName)
	if errOpen != nil {
		log.LOGGER("SERVER").Error("复制文件时，打开文件失败:%v", errOpen)
		return errOpen
	}
	defer srcFile.Close()

	//创建目标文件
	dstFile, errDst := os.Create(dstName)
	if errDst != nil {
		log.LOGGER("SERVER").Error("复制文件时，创建文件失败:%v", errDst)
		return errDst
	}
	defer dstFile.Close()

	//创建缓冲
	buf := make([]byte, 1024*4)
	for {
		n, errRead := srcFile.Read(buf)
		if errRead != nil {
			if errRead == io.EOF {
				log.LOGGER("SERVER").Info("文件复制完毕")
				return nil
			}

			log.LOGGER("SERVER").Error("文件复制出错%v", errRead)
			return errRead
		}

		_, errWrite := dstFile.Write(buf[:n])
		if errWrite != nil {
			log.LOGGER("SERVER").Error("复制文件出错%v", errWrite)
			return errWrite
		}
	}
}

//RenameFile 重名命文件
func RenameFile(old, new string) error {
	err := os.Rename(old, new)
	if err != nil {
		log.LOGGER("SERVER").Error("重名命文件失败%v", err)
		return err
	}
	log.LOGGER("SERVER").Info("%s 重命名为 %s 成功", old, new)
	return nil
}
